/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.reporte.accion;


import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.persistence.EntityManager;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
import org.reporte.control.AbstractFacade;
import org.reporte.control.Conexion;
import org.reporte.modelo.ParametroReporte;
import org.reporte.modelo.Reporte;
import org.reporte.utils.JsfAyuda;

/**
 *
 * @author 43579648
 */
@ManagedBean
@SessionScoped
public class ReporteManejador extends AbstractFacade<Reporte>{

 
    private List<Reporte> listaReportes;
    private boolean datosExternos;
    private boolean nuevaEntidad;
    private boolean mostrarDetalle;
    
    
    @ManagedProperty(value="#{parametroReporteManejador}")
    private ParametroReporteManejador parametroReporteManejador;
    
    
    /** Creates a new instance of ReporteManejador */
    public ReporteManejador() {
        super(Reporte.class);
    }

    @Override
    protected EntityManager getEntityManager() {
        return Conexion.getEntityManager();
    }
    
    public void guardarEntidad(){
        try{
            if(isNuevaEntidad()){
                //Guardando el Reporte
                if(getEntity().getNombreFichero()==null){
                    JsfAyuda.lanzarMensajeAdvertencia(JsfAyuda.getPropertyValue("reporteManagedBeanNoHayCargarFichero"));
                    return;
                }
                this.create(); 
                this.setNuevaEntidad(false);
            }else{
                //Modificando el Reporte
                this.edit();
            }
            JsfAyuda.lanzarMensajeInfo(this.getEntity().getClass().getSimpleName() + " "+JsfAyuda.getPropertyValue("managedBeanGuardadoExitosamente"));
            actualizarListaReportes();
        }catch(Exception e){
            JsfAyuda.lanzarMensajeError(JsfAyuda.getPropertyValue("managedBeanErrorGuardar") +  " - " + e.getMessage());
        }
    }
    
    public void eliminarEntidad(){
        try{
            this.remove();
            actualizarListaReportes();
            JsfAyuda.lanzarMensajeInfo(this.getEntity().getClass().getSimpleName() + " "+JsfAyuda.getPropertyValue("managedBeanEliminadoExitosamente"));
        }catch(Exception e){
            JsfAyuda.lanzarMensajeError(JsfAyuda.getPropertyValue("managedBeanErrorEliminar")+ " - " + e.getMessage());
        }
    }
    
    public void manejadorCargaFichero(FileUploadEvent event) throws Exception {
		System.out.println("--------------Cargando: "+ event.getFile().getFileName());
                this.getEntity().setFicheroReporte(event.getFile().getContents());
                this.getEntity().setNombreFichero(event.getFile().getFileName());
                JsfAyuda.lanzarMensajeInfo(JsfAyuda.getPropertyValue("reporteManagedBeanCargaFichero").replace("{0}", event.getFile().getFileName()));
                //Si es una actualizacion del reporte guardara los cambios inmediatamente
                if(!isNuevaEntidad()){
                    guardarEntidad();
                    System.out.println("reporter fichero guardado con nombre : "+ getEntity().getNombreFichero());
                }
    }
    

    
    public StreamedContent getReporteFichero(){
        InputStream reportStream = null;
        System.out.println("Ingresando descarga reporte");
        try{
            if(this.getEntity()!=null){
                ByteArrayInputStream convert = new ByteArrayInputStream(this.getEntity().getFicheroReporte());
                reportStream = convert;
                System.out.println("realizando la conversion");
            }else{
                JsfAyuda.lanzarMensajeAdvertencia(JsfAyuda.getPropertyValue("reporteManagedBeanDescargaFicheroNoEntity"));
            }
        }catch(Exception e){
            e.printStackTrace();
            JsfAyuda.lanzarMensajeError(JsfAyuda.getPropertyValue("reporteManagedBeanDescargaFicheroError") + e.getMessage());
        }
        System.out.println("enviando el fichero");
        return new DefaultStreamedContent(reportStream, "application/txt", this.getEntity().getNombreFichero()); 
      }
 
    
    public StreamedContent getReporteFicheroDesdeTabla(){
        InputStream reportStream = null;
        Reporte p = (Reporte) JsfAyuda.getBean("itemReporte");
        System.out.println("Nombre " + p.getNombre());
        try{
            
                ByteArrayInputStream convert = new ByteArrayInputStream(p.getFicheroReporte());
                reportStream = convert;
        }catch(Exception e){
            e.printStackTrace();
            JsfAyuda.lanzarMensajeError(JsfAyuda.getPropertyValue("reporteManagedBeanDescargaFicheroError") + e.getMessage());
        }
        System.out.println("enviando el fichero");
        return new DefaultStreamedContent(reportStream, "application/txt", p.getNombreFichero()); 
    }
    
    
    public String accionMostrarDetalle(){
            System.out.println("Ingresando a la accion de mostrar detalle");
            this.setMostrarDetalle(true);
            parametroReporteManejador.setDatosExternos(true);
            parametroReporteManejador.setListaParametroReporte(
            this.getEntity().getParametroReporteList().isEmpty()? new ArrayList<ParametroReporte>() : this.getEntity().getParametroReporteList());
            return "/parametroReporte/ParametroReporteVista";
    }
    

    
    public void instanciaNuevaEntidad(){
        this.setEntity(new Reporte());
        this.setNuevaEntidad(true);
    }
    
    public void instanciaNuevaEntidadParametro(){
        this.setEntity(new Reporte());
        this.setNuevaEntidad(true);
    }
    
    
     public void cerrarDialogoUsuario(){
        this.setNuevaEntidad(false);
        setMostrarDetalle(false);
    }

    public List<Reporte> getListaReportes() {
        if(!isDatosExternos()&&(listaReportes==null||listaReportes.isEmpty())){
            actualizarListaReportes();
        }
        return listaReportes;
    }
    
    public void actualizarListaReportes(){
        listaReportes = this.findAll();
    }

    public void setListaReportes(List<Reporte> listaReportes) {
        this.listaReportes = listaReportes;
    }

    public boolean isDatosExternos() {
        return datosExternos;
    }

    public void setDatosExternos(boolean datosExternos) {
        this.datosExternos = datosExternos;
    }

    public boolean isNuevaEntidad() {
        return nuevaEntidad;
    }

    public void setNuevaEntidad(boolean nuevaEntidad) {
        this.nuevaEntidad = nuevaEntidad;
    }

    public boolean isMostrarDetalle() {
        return mostrarDetalle;
    }

    public void setMostrarDetalle(boolean mostrarDetalle) {
        this.mostrarDetalle = mostrarDetalle;
    }

    public ParametroReporteManejador getParametroReporteManejador() {
        return parametroReporteManejador;
    }

    public void setParametroReporteManejador(ParametroReporteManejador parametroReporteManejador) {
        this.parametroReporteManejador = parametroReporteManejador;
    }



    
    
    

    
    
}
